﻿using System;
using System.Collections.Generic;
using Neturion.Dados;
using Neturion.IRepositorios;
using Neturion.Repositorios;
using Neturion.Utils;

namespace Neturion.Negocios
{
    /// <summary>
    /// 
    /// </summary>
    public class NegocioCliente
    {
        private IRepositorioCliente _repositorioCliente;

        /// <summary>
        /// 
        /// </summary>
        public NegocioCliente()
        {
            _repositorioCliente = new RepositorioCliente();
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="cliente"></param>
        /// <returns></returns>
        public Cliente Inserir(Cliente cliente)
        {
            cliente.Codigo = GeradorCodigo.GerarCodigo(1);
            cliente.Codigo += (_repositorioCliente.ObterUltimoIdCodigoInteiro() + 1).ToString();
            cliente.Codigo += GeradorCodigo.GerarCodigo(1, cliente.Codigo);
            return _repositorioCliente.Inserir(cliente);
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="cliente"></param>
        /// <returns></returns>
        public Cliente Atualizar(Cliente cliente)
        {
            return _repositorioCliente.Atualizar(cliente);
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="cliente"></param>
        public void Excluir(Cliente cliente)
        {
            Cliente clienteTmp = ObterPorId(cliente.ClienteId);
            _repositorioCliente.Excluir(clienteTmp);
        }

        /// <summary>
        /// 
        /// </summary>
        /// <returns></returns>
        public IList<Cliente> ObterTodos()
        {
            return _repositorioCliente.ObterTodos();
        }

        public IList<Cliente> ObterTodos(int inicio, int quantidade, int quantidadeMinima, Usuario usuarioPermissao, string nomeRazaoSocial, string apelidoFantasia, string nomeReduzido, string cpfCnpj, Midia midia, EnumTipoPessoa enumTipoPessoa, RamoAtividade ramoAtividade, DateTime? dataNascimentoAberturaDe, DateTime? dataNascimentoAberturaAte, DateTime? cadastroDe, DateTime? cadastroAte, DateTime? inicioVigenciaDe, DateTime? inicioVigenciaAte, DateTime? fimVigenciaDe, DateTime? fimVigenciaAte)
        {
            return _repositorioCliente.ObterTodos(inicio, quantidade, quantidadeMinima, nomeRazaoSocial, apelidoFantasia, nomeReduzido, cpfCnpj, midia, enumTipoPessoa, ramoAtividade, dataNascimentoAberturaDe, dataNascimentoAberturaAte, cadastroDe, cadastroAte, inicioVigenciaDe, inicioVigenciaAte, fimVigenciaDe, fimVigenciaAte);
        }

        public Cliente ObterPorCpfCnpj(Usuario usuarioPermissao, string cpfCnpj)
        {
            return _repositorioCliente.ObterPorCpfCnpj(cpfCnpj);
        }

        public Cliente ObterPorPessoa(Usuario usuarioPermissao, Pessoa pessoa)
        {
            return _repositorioCliente.ObterPorPessoa(pessoa);
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        public Cliente ObterPorId(int id)
        {
            return _repositorioCliente.ObterPorId(id);
        }

        public IList<Cliente> ObterPorRamoAtividade(RamoAtividade ramoAtividade)
        {
            return _repositorioCliente.ObterPorRamoAtividade(ramoAtividade);
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="codigo"></param>
        /// <returns></returns>
        public Cliente ObterPorCodigo(string codigo, Usuario usuarioPermissao)
        {
            return _repositorioCliente.ObterPorCodigo(codigo);
        }
    }
}